﻿//Include("Mz");

/**
 * @fileoverview 轮循数组的每一项，作为某个程序的参数
 * @author meizz
 * @version 20090423
 *
 * @namespace Mz.each
 * @param {Object} obj Array/JSON对象
 * @param {Function} fn 处理程序
 * @param {Object} context [可选]fn处理函数的宿主
 * @return {Object} 被轮循的那个数组/JSON对象
 */
Mz.each = function(obj, fn, context) {
    if (typeof fn != "function") {return obj;}
    if (typeof context != "object"){ context = null;}

    if (obj) {
        var result;
        if (typeof obj.length == "number") { /* array */
            for (var i = 0, n = obj.length; i < n; i++) {
                //被循环执行的函数，默认会传入三个参数(obj[i], i, obj)
                result = fn.call(context||null, obj[i], i, obj);

                //被循环执行的函数的返回值若为"continue"和"break"时可以影响each方法的流程
                if (result == 'continue') {continue;}
                else if (result == 'break') {break;}
            }
        } else { /* json */
            for (var key in obj) {
                //被循环执行的函数，默认会传入三个参数(obj[i], i, obj)
                result = fn.call(context||null, obj[key], key, obj);

                //被循环执行的函数的返回值若为"continue"和"break"时可以影响each方法的流程
                if (result == 'continue') {continue;}
                else if (result == 'break') {break;}
            }
        }
    }
    return obj;
};